package com.mazaiting.face.ui.utils;

import android.content.Context;
import android.hardware.Camera;
import android.view.Surface;
import android.view.WindowManager;
import com.mazaiting.face.ui.interfaces.ICameraOpenCallback;
import com.mazaiting.log.L;

/**
 * 相机工具类
 */
public class CameraUtil {

    /**
     * 打开相机
     * @param cameraIndex 相机索引
     * @param callback 打开相机回调
     * @return 相机
     */
    public static Camera open(int cameraIndex, ICameraOpenCallback callback) {
        // 声明相机
        Camera camera;
        // 获取相机数量
        int numCameras = Camera.getNumberOfCameras();
        // 判断是否有摄像头
        if (numCameras == 0) {
            return null;
        }
        // 设置默认索引
        int index = 0;
        // 当为后置摄像头
        if (cameraIndex == 0) {
            // 查找后置摄像头
            while (index < numCameras) {
                Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                Camera.getCameraInfo(index, cameraInfo);
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                    break;
                }
                index++;
            }
        } else {
            // 查找后置摄像头
            while (index < numCameras) {
                Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                Camera.getCameraInfo(index, cameraInfo);
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                    break;
                }
                index++;
            }
        }
        // 设置相机标识
        index = index < numCameras ? index : 0;
        // 打开相机
        camera = Camera.open(index);
        if (null != callback) {
            callback.open(index);
        }
        return camera;
    }

    /**
     * 释放相机
     *
     * @param camera 相机
     */
    public static void releaseCamera(Camera camera) {
        try {
            camera.release();
        } catch (Exception e) {
            L.d(e.getMessage());
        }
    }

    /**
     * 选择最佳相机预览分辨率
     *
     * @param width      宽
     * @param height     高
     * @param parameters 相机参数
     * @return 最佳相机分辨率
     */
    public static Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
        // 相机尺寸
        Camera.Size result = null;
        // 遍历手机支持的预览尺寸
        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            // 筛选预览尺寸
            if (size.width <= width && size.height <= height) {
                // 判断尺寸是否为空
                if (result == null) {
                    result = size;
                } else {
                    // 判断结果区域
                    int resultArea = result.width * result.height;
                    // 新的结果区域
                    int newArea = size.width * size.height;
                    // 检测新区域是否大于原区域
                    if (newArea > resultArea) {
                        result = size;
                    }
                }
            }
        }

        return result;
    }

    /**
     * 获取显示方向
     *
     * @param context  上下文
     * @param cameraId 相机 ID
     * @return 预览角度
     */
    public static int displayOrientation(Context context, int cameraId) {
        // 角度
        int degrees = getDegrees(context);
        // 创建相机信息
        Camera.CameraInfo info = new Camera.CameraInfo();
        // 根据相机 ID 获取相机信息
        Camera.getCameraInfo(cameraId, info);
        // 结果角度
        int result;
        // 根据前置与后置计算角度
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;   // compensate the mirror
        } else {
            // back-facing
            result = (info.orientation - degrees + 360) % 360;
        }
        return result;
    }

    /**
     * 获取角度
     *
     * @param context 上下文
     * @return 角度
     */
    private static int getDegrees(Context context) {
        // 获取窗口管理者
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        // 获取屏幕角度
        int rotation = windowManager.getDefaultDisplay().getRotation();
        // 角度
        int degrees;
        // 检测角度
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
            default:
                degrees = 0;
                break;
        }
        return degrees;
    }

    /**
     * 获取预览角度
     * 后置摄像头有问题，需要把预览的图像数据再颠倒一次。也就是加180度
     *
     * @param cameraId 相机 ID
     * @param degree   角度
     * @return 预览角度
     */
    public static int getPreviewDegree(int cameraId, int degree) {
        // 创建相机信息
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        // 根据相机 ID 获取相机信息
        Camera.getCameraInfo(cameraId, cameraInfo);
        // 获取预览角度
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
            degree += 180;
        }
        return degree;
    }

}
